home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / gkismet / RateGraph.pm < prev    next >
Text File  |  2005-10-20  |  6KB  |  206 lines

  1. #!/usr/bin/perl -w
  2. #
  3. # $Id: RateGraph.pm,v 1.5 2003/07/17 19:37:13 solovam Exp $
  4. #
  5. # This file is a part of gkismet
  6. #
  7. # This program is free software; you can redistribute it and/or
  8. # modify it under the terms of the GNU General Public License
  9. # as published by the Free Software Foundation; either version 2
  10. # of the License, or (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. # GNU General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program; if not, write to the Free Software
  19. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20. #
  21.  
  22. #
  23. # RateGraph class
  24. #
  25. package RateGraph;
  26.  
  27. use Gnome;
  28. use Misc;
  29. use TransientConnObserver;
  30. use DrawingArea;
  31. use strict;
  32. @RateGraph::ISA = qw(TransientConnObserver);
  33.  
  34. my $width = 300;
  35. my $height = 200;
  36. my $barWidth = 1;
  37. my $pegLen = 5;
  38. # We'd rather have more points than needed than fewer
  39. my $maxPoints = $width / $barWidth + 1;
  40.  
  41. #
  42. # Constructor
  43. #
  44. sub new
  45. {
  46.     my $type = shift;
  47.     my $self = new TransientConnObserver(@_);
  48.     bless $self, $type;
  49.  
  50.     # Init data
  51.     $self->{'data'} = [];
  52.  
  53.         # Window
  54.     my $window = new Gtk::Window('dialog');
  55.     $window->signal_connect("delete_event", sub {$self->deleteHandler()});
  56.     $window->set_title('Packet rate');
  57.     $self->{'window'} = $window;
  58.  
  59.     # Drawing area
  60.     # Calculate vert and horizontal padding (%.5g format WILL fit into the this width)
  61.     $self->{'hPad'} = DrawingArea->stringWidth($window, '00000') + $pegLen * 3;
  62.     $self->{'vPad'} = DrawingArea->stringHeight($window, '0') * 2 + $pegLen * 3;
  63.     $self->{'drawingArea'} = new DrawingArea($width + 2 * $self->{'hPad'} + 1, $height + 2 * $self->{'vPad'} + 1, sub {$self->drawPlot()});
  64.     my $frame = new Gtk::Frame(undef);
  65.     $frame->add($self->{'drawingArea'}->getWidget());
  66.     my $fixed = new Gtk::Fixed();
  67.     $fixed->put($frame, 0, 0);
  68.     my $hbox= new Gtk::HBox($true, 0);
  69.     $hbox->pack_start($fixed, $true, $false, 20);
  70.  
  71.     # Button
  72.     my $bbox = new Gtk::HButtonBox();
  73.     $bbox->set_layout('spread');
  74.     $bbox->set_spacing(5);
  75.     my $buttonClose = new Gtk::Button("Close");
  76.     $buttonClose->signal_connect( "clicked", sub {$self->closeClicked()});
  77.     $bbox->add($buttonClose);
  78.  
  79.     # Assemble
  80.     my $vbox = new Gtk::VBox($false, 10);
  81.     $vbox->pack_start($hbox, $true, $false, 20);
  82.         $vbox->pack_start($bbox, $true, $false, 20);
  83.         $window->add($vbox);
  84.         $window->show_all();
  85.  
  86.     # Get updates
  87.     $self->{'connection'}->addObserver($self);
  88.  
  89.     return $self;
  90. }
  91.  
  92. #
  93. # Draw the plot. A bit ugly. I tried, but...
  94. #
  95. sub drawPlot
  96. {
  97.     my $self = shift;
  98.  
  99.     # Abbreviations
  100.     my $pixmap = $self->{'drawingArea'}->pixmap();
  101.     my $gtkDrawingArea = $self->{'drawingArea'}->gtkDrawingArea();
  102.  
  103.     # Backdrop
  104.     $pixmap->draw_rectangle($gtkDrawingArea->style()->black_gc(), $true, 0, 0, $gtkDrawingArea->allocation()->[2], $gtkDrawingArea->allocation()->[3]);
  105.  
  106.     # Paddings
  107.     my $hPad = $self->{'hPad'};
  108.     my $vPad = $self->{'vPad'};
  109.  
  110.     # Horizontal axis
  111.     $pixmap->draw_line($gtkDrawingArea->style()->white_gc(), $hPad - $pegLen, $vPad + $height, $hPad + $width, $vPad + $height);
  112.     for(my $l = 0, my $i = 0; $l <= $width; $i++, $l = $barWidth * 60 * $i)
  113.     {
  114.         $pixmap->draw_line($gtkDrawingArea->style()->white_gc(),
  115.             $hPad + $width - $l, $vPad + $height, $hPad + $width - $l, $vPad + $height + $pegLen);
  116.         $pixmap->draw_string($gtkDrawingArea->style()->font(), $gtkDrawingArea->style()->white_gc(),
  117.                         $hPad + $width - $l - $self->{'drawingArea'}->stringWidth($i) / 2,
  118.             $vPad + $height + $pegLen * 2 + $self->{'drawingArea'}->stringHeight($i), $i);
  119.     }
  120.     $pixmap->draw_string($gtkDrawingArea->style()->font(), $gtkDrawingArea->style()->white_gc(),
  121.         $hPad/2 - $self->{'drawingArea'}->stringWidth('min') / 2,
  122.         $vPad + $height + $pegLen * 2 + $self->{'drawingArea'}->stringHeight('min'), 'min');
  123.  
  124.     # Vertical axis
  125.     $pixmap->draw_line($gtkDrawingArea->style()->white_gc(), $hPad + $width, $vPad - $pegLen, $hPad + $width, $vPad + $height);
  126.     my $maxRate = $self->maxRate();
  127.     my $step = Misc->pow(10, int(Misc->log10($maxRate)));
  128.     for(my $i = 0, my $l = 0; int($l) <= $height; $i++, $l = $step * $i * $height / $maxRate)
  129.         {
  130.                 $pixmap->draw_line($gtkDrawingArea->style()->white_gc(),
  131.                         $hPad + $width, $vPad + $height - $l, $hPad + $width + $pegLen, $vPad + $height - $l);
  132.                 $pixmap->draw_string($gtkDrawingArea->style()->font(), $gtkDrawingArea->style()->white_gc(),
  133.                         $hPad + $width + $pegLen * 2, $vPad + $height - $l + $self->{'drawingArea'}->stringHeight($step * $i) / 2,
  134.             sprintf('%.5g', $step * $i));
  135.         }
  136.     $pixmap->draw_string($gtkDrawingArea->style()->font(), $gtkDrawingArea->style()->white_gc(),
  137.         $hPad + $width + $pegLen * 2, $vPad / 2 + $self->{'drawingArea'}->stringHeight('Pkt/s') / 2, 'Pkt/s');
  138.  
  139.     # Plot
  140.     my $now = time();
  141.     my $prev = $now;
  142.     for(my $i = $#{$self->{'data'}}; $i >=0 && ($now - $self->{'data'}[$i]{'time'}) * $barWidth <= $width; $i--)
  143.     {
  144.         $pixmap->draw_rectangle($self->{'drawingArea'}->{'redGC'}, $true,
  145.             $hPad + $width - ($now - $self->{'data'}[$i]{'time'}) * $barWidth,
  146.             $vPad + $height - int($self->{'data'}[$i]{'rate'} * $height / $maxRate),
  147.             ($prev - $self->{'data'}[$i]{'time'}) * $barWidth,
  148.             int($self->{'data'}[$i]{'rate'} * $height / $maxRate));
  149.         $prev = $self->{'data'}[$i]{'time'};
  150.     }
  151.  
  152.     $gtkDrawingArea->draw();
  153. }
  154.  
  155. #
  156. # Max packet rate
  157. #
  158. sub maxRate
  159. {
  160.     my $self = shift;
  161.     my $max = 1;
  162.     for (@{$self->{'data'}})
  163.     {
  164.         if($_->{'rate'} > $max)
  165.         {
  166.             $max = $_->{'rate'};
  167.         }
  168.     }
  169.     return $max;
  170. }
  171.  
  172. #
  173. # Return widget
  174. #
  175. sub getWidget
  176. {
  177.     my $self = shift;
  178.     return $self->{'window'};
  179. }
  180.  
  181. #
  182. # Handle an update from an observable
  183. #
  184. sub update
  185. {
  186.     my $self = shift;
  187.     my $object = shift;
  188.     my $data = shift;
  189.  
  190.     if($object->isa('Connection') && defined $self->{'connection'} && $self->{'connection'} eq $object)
  191.     {
  192.         if($data->{'changed'} eq 'info')
  193.                 {
  194.             my $info = $self->{'connection'}->getInfo();
  195.             push @{$self->{'data'}}, {rate => $info->{'rate'}, time => time()};
  196.             if($#{$self->{'data'}} >= $maxPoints)
  197.             {
  198.                 shift @{$self->{'data'}};
  199.             }
  200.                         $self->drawPlot();
  201.                 }
  202.         }
  203. }
  204.  
  205. 1;
  206.